package pfc.aviloc.aplicacion.medicamentos;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import pfc.aviloc.R;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.util.Log;

public class MedicamentosBD extends SQLiteOpenHelper {

	//Sentencia SQL para crear la tabla de Usuarios
    //String sqlCreate = "CREATE TABLE datospersonales (codigo INTEGER, nombre TEXT)";
    Context context;
    
	public MedicamentosBD(Context context, String name, CursorFactory factory, int version) {
		super(context, name, factory, version);
		this.context = context;
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		String sqlCreate = recuperarSentenciaCreate();
		db.execSQL(sqlCreate);
	}
	
	private String recuperarSentenciaCreate() {
		String sqlCreate = "CREATE TABLE "+ context.getString(R.string.m_bd_nombre_tabla_lista_medicamentos) +" ("+
							context.getString(R.string.m_bd_campo_id_medicamento) +" TEXT, " +
							context.getString(R.string.m_bd_campo_fecha_inicio) + " TEXT, " +
							context.getString(R.string.m_bd_campo_fecha_inicio_dia) +" INTEGER, " +
							context.getString(R.string.m_bd_campo_fecha_inicio_mes) +" INTEGER, " +
							context.getString(R.string.m_bd_campo_fecha_inicio_ano) +" INTEGER, " +							
							context.getString(R.string.m_bd_campo_fecha_fin) + " TEXT, " +
							context.getString(R.string.m_bd_campo_fecha_fin_dia) +" INTEGER, " +
							context.getString(R.string.m_bd_campo_fecha_fin_mes) +" INTEGER, " +
							context.getString(R.string.m_bd_campo_fecha_fin_ano) +" INTEGER, " +							
							context.getString(R.string.m_bd_campo_nombre) +" TEXT, " +
							context.getString(R.string.m_bd_campo_descripcion) +" TEXT, " +
							context.getString(R.string.m_bd_campo_frecuencia) +" TEXT, " +
							context.getString(R.string.m_bd_campo_dosis) +" TEXT, " +
							context.getString(R.string.m_bd_campo_hora_toma) +" TEXT, " +
							context.getString(R.string.m_bd_campo_minuto_toma) +" TEXT, " +
							context.getString(R.string.m_bd_campo_nota) +" TEXT, " +							
							context.getString(R.string.m_bd_campo_fecha_actualizacion) +" TEXT )";
						
//		//Log.i("INFO","<33333333333333333333<<<<<<<< sqlCreate = "+sqlCreate);
		return sqlCreate;
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //Se elimina la version anterior de la tabla
		String sqlDrop = "DROP TABLE IF EXISTS "+context.getString(R.string.m_bd_nombre_tabla_lista_medicamentos);
        db.execSQL(sqlDrop);
        
        //Se crea la nueva version de la tabla
		String sqlCreate = recuperarSentenciaCreate();
		db.execSQL(sqlCreate);		
	}
	
	public boolean insertarBD(Medicamentos m) {
		Log.i("INFO","<<<<<<<<<<<<<<<<<<insertarMedicamento 11:");
		SQLiteDatabase db = this.getWritableDatabase();
		Log.i("INFO","<<<<<<<<<<<<<<<<<<insertarMedicamento 22:"+db.getVersion());
		// Si hemos abierto correctamente la base de datos
		if (db != null) {
			Log.i("INFO","<<<<<<<<<<<<<<<<<<insertarMedicamento 33:");
			try{
				//Recuperamos los datos a almacenar en el ContentValues
				ContentValues registroMedicamentos = m.getContentValues(context);
				Log.i("INFO","<<<<<<<<<<<<<<<<<<insertarMedicamento 44: registroMedicamentos="+registroMedicamentos);
				//Log.i("INFO","<<<<<<<<<<<<<<<<<<contentvalue>>>>>>>>>>>>>>>>>>>>>>registroMedicamentos="+registroMedicamentos);
				//String fecha = (new Date()).toLocaleString();
				////Log.i("INFO","<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>fecha="+fecha);
				//registroDatosPersonales.put(context.getString(R.string.dp_bd_campo_fecha_actualizacion), fecha);
				int respDelete = db.delete(context.getString(R.string.m_bd_nombre_tabla_lista_medicamentos), context.getString(R.string.m_bd_campo_id_medicamento)+"=?", new String[] {m.getId()});
				Log.i("INFO","<<<<<<<<<<<<<<<<<<insertarMedicamento 55: respDelete="+respDelete);				
				//int respDelete = db.delete(context.getString(R.string.m_bd_nombre_tabla_lista_medicamentos), context.getString(R.string.m_bd_campo_id_medicamento)+"=?", new String[] {cm.getId()});
				//Log.i("INFO","<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>> respDelete="+respDelete);
				//Insertamos el registro en la base de datos
				//ContentValues aa = new ContentValues();
				//aa.put("idusuario","1");
				//aa.put("nombre", "ALbert");
				long respInsert = db.insert(context.getString(R.string.m_bd_nombre_tabla_lista_medicamentos), null, registroMedicamentos);
				Log.i("INFO","<<<<<<<<<<<<<<<<<<insertarMedicamento 66: respInsert="+respInsert);
				//Log.i("INFO","<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>> respInsert="+respInsert);
				// Cerramos la base de datos
				db.close();
				if (respInsert<0){
					return false;
				}
			} catch (Exception e) {
				// TODO: handle exception
				e.printStackTrace();
				return false;
			}
			return true;
		} 
		return false;

	}

	public ArrayList<Medicamentos> recuperarBD(){
		//Log.i("INFO","<<<<<<<<<-1-");
		Medicamentos medicamento = null;
		ArrayList<Medicamentos> listaMedicamentos = null;
		
		//Log.i("INFO","<<<<<<<<<-2-");
		SQLiteDatabase db = this.getWritableDatabase();
		//Log.i("INFO","<<<<<<<<<-3-");
		// Si hemos abierto correctamente la base de datos
		if (db != null) {
			//Log.i("INFO","<<<<<<<<<-4-");
			//db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy);
            Calendar cal = new GregorianCalendar();
            cal.setTimeInMillis((new Date()).getTime());
            //cal.add(Calendar.DATE,-1);
            Date fechaHoy = new Date(cal.getTimeInMillis());
			//Date fechaActual = new Date();
			//Log.i("INFO","<<<<<<<<<-5-");
			String fechaDia = ""+fechaHoy.getDate();
			String fechaMes = ""+(fechaHoy.getMonth()+1);
			String fechaAno = ""+(fechaHoy.getYear()+1900);
			  
			Log.i("INFO","<<<<<<<<<-6-"+fechaDia);
			String nameColumnAnoInicio = context.getString(R.string.m_bd_campo_fecha_inicio_ano);
			String nameColumnMesInicio = context.getString(R.string.m_bd_campo_fecha_inicio_mes);
			String nameColumnDiaInicio = context.getString(R.string.m_bd_campo_fecha_inicio_dia);
			
			String nameColumnAnoFin = context.getString(R.string.m_bd_campo_fecha_fin_ano);
			String nameColumnMesFin = context.getString(R.string.m_bd_campo_fecha_fin_mes);
			String nameColumnDiaFin = context.getString(R.string.m_bd_campo_fecha_fin_dia);
			
			//Log.i("INFO","<<<<<<<<<-7-");
			String condicionWhereFecha = 
				"("+ nameColumnAnoInicio +"<? AND "+ nameColumnAnoFin +">? )" +
				" OR ("+ nameColumnAnoInicio +"=? AND "+ nameColumnMesInicio +"<? AND "+ nameColumnAnoFin +">? )" +
				" OR ("+ nameColumnAnoInicio +"=? AND "+ nameColumnMesInicio +"=? AND "+ nameColumnDiaInicio +"<=? AND "+ nameColumnAnoFin +">? )" +
				" OR ("+ nameColumnAnoInicio +"<? AND "+ nameColumnAnoFin +"=? AND "+ nameColumnMesFin +">? )" +
				" OR ("+ nameColumnAnoInicio +"<? AND "+ nameColumnAnoFin +"=? AND "+ nameColumnMesFin +"=? AND "+ nameColumnDiaFin +">=? )" +
				" OR ("+ nameColumnAnoInicio +"=? AND "+ nameColumnAnoFin +"=? AND "+ nameColumnMesInicio +"<? AND "+ nameColumnMesFin +">? )" +
				" OR ("+ nameColumnAnoInicio +"=? AND "+ nameColumnAnoFin +"=? AND "+ nameColumnMesInicio +"=? AND "+ nameColumnDiaInicio +"<=? AND "+ nameColumnMesFin +">? )" +
				" OR ("+ nameColumnAnoInicio +"=? AND "+ nameColumnAnoFin +"=? AND "+ nameColumnMesInicio +"<? AND "+ nameColumnMesFin +"=? AND "+ nameColumnDiaFin +">=? )" +
				" OR ("+ nameColumnAnoInicio +"=? AND "+ nameColumnAnoFin +"=? AND "+ nameColumnMesInicio +"=? AND "+ nameColumnMesFin +"=? AND "+ nameColumnDiaInicio +"<=? AND "+ nameColumnDiaFin +">=? )";
				
			String[] condicionDatosFecha = new String[] {fechaAno, fechaAno, 
					fechaAno, fechaMes, fechaAno, 
					fechaAno, fechaMes, fechaDia, fechaAno,
					fechaAno, fechaAno, fechaMes,  
					fechaAno, fechaAno, fechaMes, fechaDia,
					fechaAno, fechaAno, fechaMes, fechaMes,
					fechaAno, fechaAno, fechaMes, fechaDia, fechaMes,
					fechaAno, fechaAno, fechaMes, fechaMes, fechaDia,
					fechaAno, fechaAno, fechaMes, fechaMes, fechaDia, fechaDia};
			
			//Log.i("INFO","<<<<<<<<<-8-");
			Cursor c = db.query(context.getString(R.string.m_bd_nombre_tabla_lista_medicamentos), null, condicionWhereFecha, condicionDatosFecha, null, null, nameColumnAnoInicio + ", " +nameColumnMesInicio + ", " + nameColumnDiaInicio);// + ", "+ nameColumnAno + " ASC, "+ nameColumnMes );//+ " ASC, "+ nameColumnDia + "ASC");
			//Log.i("INFO","<<<<<<<<<-9-");
			if ( (c != null) && (c.moveToFirst()) ) {
				//Log.i("INFO","<<<<<<<<<-10-");
				int numColumnas = c.getColumnCount();
				//Log.i("INFO","<<<<<<<<<-11-");
				listaMedicamentos = new ArrayList<Medicamentos>();
				do {					
					//Log.i("INFO","<<<<<<<<<-12-");
					ContentValues datosContentValues = new ContentValues();
					for (int i = 0 ; i < numColumnas ; i++) {
						String columna = c.getColumnName(i);
						String valor = c.getString(i);
						datosContentValues.put(columna, valor);					
					}	
					medicamento = new Medicamentos(datosContentValues, context);
					Log.i("INFO","<<<<<<<<<-12AA-"+medicamento);
					listaMedicamentos.add(medicamento);
				} while (c.moveToNext());
			}

			//Log.i("INFO","<<<<<<<<<-13-"+listaMedicamentos);
			if ((c != null) && (!c.isClosed())){
				//Log.i("INFO","<<<<<<<<<-14-");
				c.close();
			}	
			db.close();
		}
		//Log.i("INFO","<<<<<<<<<-15-");
		return listaMedicamentos;	
	}
	
	public Medicamentos recuperarBD(String id){
		Medicamentos datosMedicamento = null;
		SQLiteDatabase db = this.getWritableDatabase();
		// Si hemos abierto correctamente la base de datos
		if (db != null) {
			//db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy);
			Cursor c = db.query(context.getString(R.string.m_bd_nombre_tabla_lista_medicamentos), null, context.getString(R.string.m_bd_campo_id_medicamento)+"=?", new String[] {id}, null, null, null);
			if ( (c != null) && (c.moveToFirst()) ) {
				int numColumnas = c.getColumnCount();
				ContentValues datosContentValues = new ContentValues();
				for (int i = 0 ; i < numColumnas ; i++) {
					String columna = c.getColumnName(i);
					String valor = c.getString(i);
					datosContentValues.put(columna, valor);					
				}
				datosMedicamento = new Medicamentos(datosContentValues, context);
			}
			db.close();
		}
		return datosMedicamento;
	}	
}